Ruby 日記 34日目: 正規表現の文字クラス
次のコードを実行するとどうなりますか
code:gold/ex34/main.rb
p "Matz is my tEacher".scan(/is|my/).length 選択肢:
2と表示される
4と表示される
6と表示される
8と表示される
解説:
scan(pattern) -> [String] | [[String]]
self に対して pattern を繰り返しマッチし、 マッチした部分文字列の配列を返します。
pattern が正規表現で括弧を含む場合は、 括弧で括られたパターンにマッチした部分文字列の配列の配列を返します。
ふむふむ
じゃあ今回は "Matz is my tEacher" に対して /[is|my]/ にマッチする部分文字列はなに?という話になるね
正規表現の [] について
文字クラス(character class) とは角括弧 [ と ] で囲まれ、1個以上の文字を列挙したもので、 いずれかの1文字にマッチします。
そうだね
/W[aeiou]rd/
は Ward, Werd, Wird, Word, Wurd のいずれかにマッチします。
分かりやすい例だね〜
文字クラスでは、否定(^)範囲(-)共通部分(&&)列挙(並べる)という 演算が可能です
文字クラス[]の中で意味のある記号(メタ文字)は ^ - && の3つってことだね
これらは - > (列挙) > && > ^ という順の結合強度を持ちます。
ふむふむ、そうなのね〜
文字クラス内の3つのメタ文字を通常の文字の意味で使用したい場合には、 \ によってエスケープ する必要があります。
おっけ〜
よしじゃあ
じゃあ今回は "Matz is my tEacher" に対して /[is|my]/ にマッチする部分文字列はなに?という話になるね
について確認してみよう。
/[is|my]/ は i,s,|,m,y のいずれかの1文字にマッチするものを探すってことだね
"Matz is my tEacher" は i,s,m,y が1文字ずつ含まれていて、|は含まれていないね
なので "Matz is my tEacher".scan(/[is|my]/) はこの4つの文字を配列として返すことになる
したがって正解は「4と表示される」ダネ〜
code:sh
# ruby gold/ex34/main.rb
4
/icons/hr.icon
文字クラス[]が使われていなかったとしたら...?
code:gold/ex34/sample.rb
p "Matz is my tEacher".scan(/is|my/).length
/is|my/ は is または my にマッチするものを探す、ということだね
ここでの | は「選択子」というメタ文字
選択子
pat1|pat2 どちらか一方がマッチすれば良い
code:sh
# ruby gold/ex34/sample.rb
2